package com.petdog.common.util;

import com.petdog.infrastructure.entity.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import javax.servlet.http.HttpServletRequest;

/**
 * 管理员认证工具类
 */
@Slf4j
public class AdminAuthUtil {

    // 角色常量定义
    public static final Integer ROLE_SUPER_ADMIN = 999; // 超级管理员角色ID
    public static final Integer ROLE_AUDITOR = 888;    // 审计员角色ID
    public static final Integer ROLE_ADMIN = 100;      // 普通管理员角色ID

    /**
     * 检查当前用户是否有管理员权限（包括普通管理员、审计员和超级管理员）
     */
    public static boolean hasAdminRole() {
        try {
            Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
            if (principal instanceof UserDetails) {
                UserDetails userDetails = (UserDetails) principal;
                return userDetails.getAuthorities().stream()
                        .anyMatch(authority -> "ROLE_ADMIN".equals(authority.getAuthority()));
            }
            return false;
        } catch (Exception e) {
            log.error("检查管理员权限失败", e);
            return false;
        }
    }

    /**
     * 检查当前用户是否为超级管理员
     */
    public static boolean hasSuperAdminRole() {
        return checkUserRole(ROLE_SUPER_ADMIN);
    }

    /**
     * 检查当前用户是否为审计员
     */
    public static boolean hasAuditorRole() {
        return checkUserRole(ROLE_AUDITOR);
    }

    /**
     * 检查当前用户是否具有审计权限（超级管理员或审计员）
     */
    public static boolean hasAuditPermission() {
        return hasSuperAdminRole() || hasAuditorRole();
    }

    /**
     * 检查用户是否有特定角色
     */
    private static boolean checkUserRole(Integer roleId) {
        try {
            // 在实际项目中，这里应该从认证信息中获取用户角色
            // 这里简化处理，假设可以通过某种方式获取当前用户
            // 注意：实际实现需要根据项目的认证机制调整
            // 此方法为简化版本，实际应用需要根据具体认证机制实现
            return false; // 默认返回false，实际应用中需要替换为真实逻辑
        } catch (Exception e) {
            log.error("检查用户角色失败", e);
            return false;
        }
    }

    /**
     * 获取当前管理员用户名
     */
    public static String getCurrentAdminUsername() {
        try {
            Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
            if (principal instanceof UserDetails) {
                UserDetails userDetails = (UserDetails) principal;
                if (hasAdminRole()) {
                    return userDetails.getUsername();
                }
            }
            return null;
        } catch (Exception e) {
            log.error("获取当前管理员用户名失败", e);
            return null;
        }
    }

    /**
     * 验证请求是否来自管理员
     */
    public static boolean validateAdminRequest(HttpServletRequest request) {
        // 1. 检查是否有管理员角色
        if (!hasAdminRole()) {
            return false;
        }
        
        // 2. 可以添加其他验证逻辑，如IP限制、二次验证等
        // 例如：验证特定IP段
        /*
        String ip = getIpAddress(request);
        if (!isAllowedIp(ip)) {
            return false;
        }
        */
        
        return true;
    }

    /**
     * 验证请求是否来自有权审计的用户（超级管理员或审计员）
     */
    public static boolean validateAuditRequest(HttpServletRequest request) {
        // 1. 检查是否有管理员角色
        if (!hasAdminRole()) {
            return false;
        }
        
        // 2. 检查是否有审计权限
        if (!hasAuditPermission()) {
            return false;
        }
        
        return true;
    }

    /**
     * 构建简单的管理员认证令牌
     * 实际项目中应使用JWT等安全令牌
     */
    public static String generateAdminToken(String username) {
        // 这里仅作为示例，实际项目中应使用JWT等安全机制
        // 如：JwtUtil.generateToken(username, "ADMIN");
        return "ADMIN_TOKEN:" + username + ":" + System.currentTimeMillis();
    }

    /**
     * 从请求头中获取认证令牌
     */
    public static String getAuthTokenFromRequest(HttpServletRequest request) {
        String token = request.getHeader("Authorization");
        if (token != null && token.startsWith("Bearer ")) {
            return token.substring(7);
        }
        return null;
    }
}
